#ifndef HTTP_PARSER_H 
#define HTTP_PARSER_H 

#include "http.h"
#include "http11_common.h"
#include "http11_parser.h"
#include "httpclient_parser.h"


namespace MYHTTP
{

//http请求协议解析类
class HttpRequestParser
{
public:
using ptr = std::shared_ptr<HttpRequestParser>;

HttpRequestParser();

/**
 * @brief 解析协议
 * @param[in, out] data 协议文本内存
 * @param[in] len 协议文本内存长度
 * @return 返回实际解析的长度,并且将已解析的数据移除
 */
size_t execute(char* data, size_t len);

//是否解析完成
int isFinished();

//是否有错误
int hasError(); 

//获取HttpRequest
HttpRequest::ptr getData() const { return m_data; }

//获取http_parser
const http_parser& getParser() const { return m_parser; }

//设置错误号
void setError(int v) { m_error = v; }

//获取消息体长度
uint64_t getContentLength();

//返回HttpRequest协议解析的缓存大小
static uint64_t GetHttpRequestBufferSize();

//返回HttpRequest协议的最大消息体大小
static uint64_t GetHttpRequestMaxBodySize();

private:
    http_parser m_parser;       //http请求解析类
    HttpRequest::ptr m_data;    //http请求协议类
    int m_error;                //错误号
    /// 1000: invalid method
    /// 1001: invalid version
    /// 1002: invalid field
};


//http响应协议解析类
class HttpResponseParser
{
public:
using ptr = std::shared_ptr<HttpResponseParser>;

HttpResponseParser();

/**
 * @brief 解析协议
 * @param[in, out] data 协议文本内存
 * @param[in] len 协议文本内存长度
 * @param[in] chunck 是否在解析chunck（数据包是否分块）
 * @return 返回实际解析的长度,并且移除已解析的数据
 */
size_t execute(char* data, size_t len, bool chunck);

//是否解析完成
int isFinished();

//是否有错误
int hasError(); 

//获取HttpRequest
HttpResponse::ptr getData() const { return m_data; }

//获取http_parser
const httpclient_parser& getParser() const { return m_parser; }

//设置错误号
void setError(int v) { m_error = v; }

//获取消息体长度
uint64_t getContentLength();

//返回HttpResponse协议解析的缓存大小
static uint64_t GetHttpRequestBufferSize();

//返回HttpResponse协议的最大消息体大小
static uint64_t GetHttpRequestMaxBodySize();

private:
    httpclient_parser m_parser; //http响应结构体
    HttpResponse::ptr m_data;   //http响应协议类
    int m_error;                //错误号
    /// 1001: invalid version
    /// 1002: invalid field
};

}   //MYHTTP

#endif //HTTP_PARSER_H